import ar.uba.fi.algo3.titiritero.ControladorJuego;


public class LaberintoFactory {
	
	
	/*OPERACIONES*/
	public static Laberinto crearLaberinto(ControladorJuego controlador){
		
		Laberinto laberinto = new Laberinto();
		Punto dimension = laberinto.getDimension();
		Punto pos;
		Celda celda;
		//simulaci�n de archivo de texto
		String codigoLaberinto = 	"1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;" +
									"1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1;" +
									"1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1;" +
									"1,4,1,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,2,1,1,1,4,1;" +
									"1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1;" +
									"1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1;" +
									"1,2,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,2,1;" +
									"1,2,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,2,1;" +
									"1,2,2,2,2,2,2,1,1,2,2,2,2,1,1,2,2,2,2,1,1,2,2,2,2,2,2,1;" +
									"1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,3,3,3,3,3,3,3,3,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,1,3,3,3,3,3,3,1,3,1,1,2,1,1,1,1,1,1;" +
									"5,3,3,3,3,3,2,3,3,3,1,3,3,3,3,3,3,1,3,3,3,2,3,3,3,3,3,5;" +
									"1,1,1,1,1,1,2,1,1,3,1,3,3,3,3,3,3,1,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,3,3,3,6,3,3,3,3,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1;" +
									"1,1,1,1,1,1,2,1,1,3,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1;" +
									"1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1;" +
									"1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1;" +
									"1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1;" +
									"1,4,2,2,1,1,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,1,1,2,2,4,1;" +
									"1,1,1,2,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,2,1,1,1;" +
									"1,1,1,2,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,2,1,1,1;" +
									"1,2,2,2,2,2,2,1,1,2,2,2,2,1,1,2,2,2,2,1,1,2,2,2,2,2,2,1;" +
									"1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1;" +
									"1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1;" +
									"1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1;" +
									"1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
		
		String[] filaLaberinto = codigoLaberinto.split(";");
		
		for(int i = 0; i < dimension.getX(); i++){
			
			String[] columnaLaberinto = filaLaberinto[i].split(",");
			
			for(int j = 0; j < dimension.getY(); j++){
				
				switch(Integer.parseInt(columnaLaberinto[j])) {
				case 1: //Pared
					
					pos = new Punto(i, j);
					celda = new CeldaPared(pos);
					laberinto.setCelda(celda);
					break;
					
				case 2: //Pasillo c/ pastilla
					
					pos = new Punto(i, j);
					Pastilla pastilla = generarPastilla(i, j, controlador);
					celda = new CeldaPasillo(pos);
					
					celda.agregarElemento(pastilla);
					laberinto.setCelda(celda);
					break;
					
				case 3: //Pasillo vacio
					
					pos = new Punto(i, j);
					celda = new CeldaPasillo(pos);
					
					laberinto.setCelda(celda);
					break;
					
				case 4: //Pasillo con Power
					
					pos = new Punto(i, j);
					Power pow = generarPower( i, j, controlador);
					celda = new CeldaPasillo(pos);
					
					celda.agregarElemento(pow);
					laberinto.setCelda(celda);
					break;
					
				case 5: //Pasadizo
					
					pos = new Punto(i, j);
					celda = new CeldaPasadizo(pos);
					laberinto.setCelda(celda);
					break;
				
				case 6: //Pasillo c/Fruta
					
					pos = new Punto(i, j);
					Fruta fruta = generarFruta( i, j, controlador);
					celda = new CeldaPasillo(pos);
					
					celda.agregarElemento(fruta);
					laberinto.setCelda(celda);
					break;
				}
			}	
		}
		return laberinto;
	}
	
	private static Power generarPower(int i, int j, ControladorJuego controlador) {
		// Variables auxiliares
		VistaDePower unaVistaDePower = null;
		Power unPower = null;
		
		unPower = new Power(i, j);
		unaVistaDePower = new VistaDePower();
		unaVistaDePower.setPosicionable(unPower);
		controlador.agregarDibujable(unaVistaDePower);
		
		return unPower;
	}

	private static Fruta generarFruta(int i, int j, ControladorJuego controlador) {
		// Variables auxiliares
		VistaDeFruta unaVistaDeFruta = null;
		Fruta unaFruta = null;
		
		unaFruta = new Fruta(i, j);
		unaVistaDeFruta = new VistaDeFruta();
		unaVistaDeFruta.setPosicionable(unaFruta);
		controlador.agregarDibujable(unaVistaDeFruta);
		
		return unaFruta;
	}

	private static Pastilla generarPastilla(int i, int j, ControladorJuego controlador) {
		// Variables auxiliares
		VistaDePastilla unaVistaDePastilla = null;
		Pastilla unaPastilla = null;
		
		unaPastilla = new Pastilla(i, j);
		unaVistaDePastilla = new VistaDePastilla();
		unaVistaDePastilla.setPosicionable(unaPastilla);
		controlador.agregarDibujable(unaVistaDePastilla);
		
		return unaPastilla;
	}
}
